#variable stockant les zones de texte, les scrollbar et les noms des differents salons
# on a donc pour "a" :
# var_zoneTexteSalons(a)
# var_zoneTexteSalons(a, zoneDeTexte)
# var_zoneTexteSalons(a, scrollBar)
global var_zoneTexteSalons


################################################################################
# Procedure rafraichissant les messages recus pour un salon donne
################################################################################
proc proc_afficheMessagesSalon { param_salonId } {	
	if { $param_salonId == -1 } {
		return
	}
	# Ecrit les messages dans la zone de reception
	# Commence par effacer le contenu
	global var_zoneTexteSalons
	$var_zoneTexteSalons($param_salonId,zoneDeTexte) delete 0.0 end
	
	set var_listeMessages [proc_getMessagesSalon $param_salonId]
	
	# Tri des messages
	set var_listeMessagesTri {}
	
	while { [llength $var_listeMessages] > 0 } {
		set var_min 0
		array set var_tmp [lindex $var_listeMessages 0]
		set var_estMin $var_tmp(estampille)
		for { set j 0 } { $j < [llength $var_listeMessages] } { incr j} {
			
			array set var_tmp [lindex $var_listeMessages $j]
			set var_estCur $var_tmp(estampille)
			if { $var_estCur < $var_estMin } {
				set var_min $j
				array set var_tmp [lindex $var_listeMessages $j]
				set var_estMin $var_tmp(estampille)
			}
		}
		lappend var_listeMessagesTri [lindex $var_listeMessages $var_min]
		set var_listeMessages [lreplace $var_listeMessages $var_min $var_min]
	}
	
	# Reaffiche tous les messages du salon
	foreach var_message $var_listeMessagesTri {
		array set var_MessageArray $var_message
		#$var_zoneTexteSalons($param_salonId,zoneDeTexte)  insert end "\[($var_MessageArray(estampille)):$var_MessageArray(noeudId):[proc_getNoeudPseudo $var_MessageArray(noeudId)]\] $var_MessageArray(corps)"
		$var_zoneTexteSalons($param_salonId,zoneDeTexte)  insert end "\[$var_MessageArray(noeudId):[proc_getNoeudPseudo $var_MessageArray(noeudId)]\] $var_MessageArray(corps)"
		$var_zoneTexteSalons($param_salonId,zoneDeTexte)  insert end "\n"
	}	
	
	#FIXME comment baisser la scrollbar
	# Baisse la scrollbar tout en bas (ne marche pas)
	#$var_zoneTexteSalons($param_salonId,scrollBar) set 1 1
	
	# Met a jour l'affichage
	update
	
}





################################################################################
# Procedure affichant la liste des voisins 
################################################################################
proc proc_afficheListeVoisins { } {
	set var_listeVoisinsId [proc_getListeVoisinsId]

	#.content.right.frameUsers.listeVoisins delete 0 end
	emptyTreeVoisins
	fillTreeVoisins $var_listeVoisinsId
	#foreach var_idVoisin $var_listeVoisinsId {	
	#	.content.right.frameUsers.listeVoisins insert end "$var_idVoisin \([proc_getVoisinDistance $var_idVoisin]\)"
	#	
	#}
}

################################################################################
# Procedure affichant la liste des noeuds connectes a un salon
################################################################################
proc proc_afficheListeNoeudsConnecteSalon { param_salonId } {
	if { $param_salonId == -1 } {
		return
	}
	
	
	set var_listeConnectes [proc_getSalonConnectes $param_salonId]
	#proc_affichageErreur $var_listeConnectes
	
	global var_salonCourantId
	if { $var_salonCourantId == $param_salonId } {
		emptyTreeUsers
		fillTreeUsers $var_listeConnectes
	}	
}

################################################################################
# Procedure d'ajout d'un salon a l'interface
################################################################################
proc proc_ajoutSalonInterface { param_salonId } {
	global var_zoneTexteSalons
	# Generation d'un nom servant a identifier l'onglet
	set var_paneSalon "pane_$param_salonId"
	#nom du salon affiche dans l'onglet
	set nomSalon [proc_getSalonNom $param_salonId]

	set var_existeDeja [info exists var_zoneTexteSalons($param_salonId)]

	#essaie t'on d'inserer un salon qui existe deja?
	if { $var_existeDeja == 0 } {
		set pane [ajoutPaneSalon $var_paneSalon $nomSalon]
		
		set ltext [tile::scrolled text $pane.t -wrap none]

		pack $ltext -expand yes -fill both
		
		# Specifie ou les message doivent etre ecrit
		#set var_listeSalons($param_salonId,zoneDeTexte) $pane.t
		
		set var_zoneTexteSalons($param_salonId,zoneDeTexte) $pane.t
		#set var_zoneTexteSalons($param_salonId,scrollBar) $pane.scrollv
		set var_zoneTexteSalons($param_salonId) $param_salonId
	} else {
		
		proc_affichageErreur "Le salon $nomSalon existe deja"
	}
}

################################################################################
# Procedure d'ajout d'un salon a l'interface
################################################################################
proc proc_changerSalonInterface { param_salonId } {
	# Generation d'un nom servant a identifier l'onglet
	set var_paneSalon "pane_$param_salonId"
	callback_changementSalon $var_paneSalon
}


################################################################################
# Procedure renvoyant le salon selectionne dans la liste
################################################################################
proc proc_getSalonSelectionne { } {
	global listeSalonsTree
	#return [.content.left.frameSalons.listeSalons curselection]
	return [$listeSalonsTree.t selection]
}


################################################################################
# Procedure appelee au clic sur un salon
################################################################################
proc callback_connexionSalon { } {
	proc_connexionSalon [proc_getSalonSelectionne]
}

################################################################################
# Procedure appelee a la deconnexion d'un salon
################################################################################
proc callback_deconnexionSalon { var_param_tab} {
	regexp {pane_(.*)$} $var_param_tab null var_salonId
	proc_deconnexionSalon $var_salonId
	#.content.center.frameMessages.notebookMessages delete $var_param_tab
	#global var_zoneTexteSalons
	#unset var_zoneTexteSalons($var_salonId,zoneDeTexte)
	#unset var_zoneTexteSalons($var_salonId,scrollBar)
	#unset var_zoneTexteSalons($var_salonId)
}

################################################################################
# Procedure appelee a la deconnexion d'un salon
################################################################################
proc proc_deconnexionSalonInterface { param_salonId } {
	set var_paneSalon "pane_$param_salonId"
	#.content.center.frameMessages.notebookMessages delete $var_paneSalon
	retirePaneSalon $var_paneSalon

	global var_zoneTexteSalons
	unset var_zoneTexteSalons($param_salonId,zoneDeTexte)
	unset var_zoneTexteSalons($param_salonId)
}


################################################################################
# Procedure appelee au changemenent de salon
################################################################################
proc callback_changementSalon { var_param_tab} {
	
	regexp {pane_(.*)$} $var_param_tab null var_salonId

	proc_setSalonCourantId $var_salonId
	#.content.center.frameMessages.notebookMessages raise $var_param_tab
	selectPaneSalon $var_param_tab
	proc_afficheListeNoeudsConnecteSalon [proc_getSalonCourantId]
	proc_afficheMessagesSalon [proc_getSalonCourantId]
}

################################################################################
# Procedure de mise a jour de la liste des salons
################################################################################
proc proc_updateListeSalons { } {
	
	# Recupere la liste des salons via sa variable globale
	set var_listeSalons [proc_getListeIdsSalons]

	# Efface l'affichage de l'ancienne liste
	#.content.left.frameSalons.listeSalons delete 0 end
	emptyTreeSalons
	
	# Affiche la nouvelle liste (le tri fonctionne sur les clefs => a modifier pour trier sur le nom)
	# et cree les objets du tableau de message
	fillTreeSalons $var_listeSalons
	
	# Met a jour l'affichage
	update
}

################################################################################
# Procedure affichant periodiquement la liste des voisins
################################################################################
proc proc_voisinsAfficher { } {
	global const_delaiAffichageListeVoisins
	#affiche la liste des voisins
	proc_afficheListeVoisins
	# programmation du prochain affichage
	after $const_delaiAffichageListeVoisins proc_voisinsAfficher
}

